package servicios;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import persistencia.CriterioDAO;
import persistencia.DataAccessObject;
import persistencia.PedidoDAO;
import persistencia.PersistentException;
import persistencia.ProductoPedidoDAO;
import ui.Fachada;
import dominio.Cliente;
import dominio.Pedido;
import dominio.Producto;
import dominio.ProductoPedido;

public class ServiciosPedido extends BusinessService{


	public static List<Object> obtenerProductosNotIn(Pedido unPedido) throws GenericBusinessException {
		try {
			List<Object> losProductos=Fachada.getListaProductos();
			if(!unPedido.getEstado().equals("Nuevo")){
				for (int i = 0; i < unPedido.getProductosPedido().size(); i++) {
					Producto unProducto1=unPedido.getProductosPedido().get(i).getProducto();
					for(int x = 0; x < losProductos.size();x++){
						Producto unProducto2=(Producto) losProductos.get(x);
						if(unProducto1.getNombre().equals(unProducto2.getNombre())){
							losProductos.remove(unProducto2);
						}
					}

				}	
			}
			return losProductos;
		} catch (Exception e) {
			throw new SystemException(e.getMessage());
		}

	}

	public static List<Object> listarPedidos() throws GenericBusinessException{
		try {
			PedidoDAO pd=new PedidoDAO();
			List<Object> pedidos=pd.selectAll();
			return pedidos;
		} catch (PersistentException e) {
			 throw new SystemException(e.getMessage());
		}
	}

	public static int guardar(Pedido unPedido) throws GenericBusinessException {
		PedidoDAO pd=new PedidoDAO();
		try {
			Pedido pedido=PedidoDAO.buscarPorIdPedido(unPedido.getId());
			if(pedido!=null){
				pd.update(unPedido);
				guardarProductosPedido(unPedido);
			}else{
				int id=DataAccessObject.proximoOid();
				unPedido.setId(id);
				pd.insert(unPedido);
			}
		}catch (PersistentException pex){
			throw new SystemException(pex.getMessage());
		}
		return unPedido.getId();
	}


	private static void guardarProductosPedido(Pedido unPedido) throws GenericBusinessException {
		ProductoPedidoDAO ppd=new ProductoPedidoDAO();
		try {
			if(unPedido.getProductosPedido()!=null){
				ppd.delete(unPedido);
				ppd.insert(unPedido);
			}
		}catch (PersistentException pex){
			throw new SystemException(pex.getMessage());
		}

	}

	public static void eliminar(Pedido unPedido)throws GenericBusinessException{
		PedidoDAO pd=new PedidoDAO();
		ProductoPedidoDAO ppd=new ProductoPedidoDAO();
		try {
			pd.delete(unPedido);
			ppd.delete(unPedido);
		}catch(PersistentException pex){
			throw new SystemException(pex.getMessage());
		}
	}

	public static Pedido buscarPedido(int idPedido) throws GenericBusinessException {
		try {
			return PedidoDAO.buscarPorIdPedido(idPedido);
		} catch (PersistentException e) {
			 throw new SystemException(e.getMessage());
		}
	
	}



	/*public static List<Object> getPlanProduccion() throws GenericBusinessException {
		try {
			int planProduccion=PedidoDAO.getCriterio();
			List<Object> retorno=new ArrayList<Object>();
			if(planProduccion==1){
				PlanProduccion ordenEntrega=new CriterioOrdenEntrega();
				retorno=ordenEntrega.ejecutar();	
			}else if(planProduccion==2){
				PlanProduccion margenGanancia=new CriterioMargenGanancia();
				retorno=margenGanancia.ejecutar();
			}else if(planProduccion==3){
				PlanProduccion prioridadCliente=new CriterioPrioridadCliente();
				retorno=prioridadCliente.ejecutar();
			}
			return retorno;
		} catch (PersistentException e) {
			throw new SystemException(e.getMessage());
		}
	}*/

	
	public static double calcularGanancia(Pedido pedido){
		double retorno=new Double(0);
		for(int i=0;i<pedido.getProductosPedido().size();i++){
			ProductoPedido pp=pedido.getProductosPedido().get(i);
			Producto p=pp.getProducto();
			retorno+=(pp.getCantidad()*p.getPrecioVenta())-(pp.getCantidad()*p.getCostoUnidad());
		}
		return retorno;
	}

	public static int getCriterio() throws GenericBusinessException{
		try {
			int planProduccion=CriterioDAO.getCriterio();
			return planProduccion;
		} catch (PersistentException e) {
			throw new SystemException(e.getMessage());
		}
	}

	public static void finalizarPedido(Pedido pedido) throws GenericBusinessException {
		pedido.setEstado("Finalizado");
		Fachada.guardarPedido(pedido);
		
	}

	public static int getPedidoFinalizable(List<Object> resultado) {
		boolean fin=false;
		int row=-1;
		int i=0;
		while(i<resultado.size()&&fin==false){
			Pedido pedido=(Pedido) resultado.get(i);
			if(!pedido.getEstado().equals("Finalizado")){
				fin=true;
				row=i;
			}
			i++;
		}
		return row;
	}

	public static boolean productoEnPedido(int idProducto) throws GenericBusinessException {
		try {
			boolean productoEnPedido=PedidoDAO.productoEnPedido(idProducto);
			return productoEnPedido;
		} catch (PersistentException e) {
			throw new SystemException(e.getMessage());
		}
	}

	public static List<Pedido> getPedidosNoFin() throws GenericBusinessException {
		try {
			return PedidoDAO.buscarPorEstado("En Espera");
		} catch (PersistentException e) {
			throw new SystemException(e.getMessage());
		}
	}

	public static List<Pedido> getPedidosXFecha(Date fechaIni,Date fechaFin) throws GenericBusinessException {
		try {
			return PedidoDAO.buscarPorFecha(fechaIni,fechaFin);
		} catch (PersistentException e) {
			throw new SystemException(e.getMessage());
		}
	}

	public static List<Pedido> getPedidos(Cliente unCliente) throws GenericBusinessException {
		try {
			return PedidoDAO.buscarPorIdCliente(unCliente);
		} catch (PersistentException e) {
			throw new SystemException(e.getMessage());
		}
	}

	public static Object calcularTiempoProduccion(Pedido pedido) {
		double retorno=new Double(0);
		for(int i=0;i<pedido.getProductosPedido().size();i++){
			ProductoPedido pp=pedido.getProductosPedido().get(i);
			Producto p=pp.getProducto();
			retorno+=(pp.getCantidad()*p.getTiempoProduccion());
		}
		retorno=(retorno/60)/24;
		int decimalPlace = 2;
	    BigDecimal bd = new BigDecimal(retorno);
	    bd = bd.setScale(decimalPlace,BigDecimal.ROUND_UP);
	    retorno = bd.doubleValue();
	    return retorno;
	}

	
	
}
